/*
 * file  : list.c
 * date  : 2022-03-19
 * author: Lin
 */

#include "list.h"

/*
 * @brief	线性表初始化
 * @param	pL 线性表控制块指针
 * @return  0
 */
int ListInit(List_t *pL)
{
	pL->length = 0;

	printf("list init.\n");

	return 0;
}

/*
 * @brief	线性表是否为空
 * @param	pL 线性表控制块指针
 * @return  是：1		否：0
 */
int ListIsEmpty(List_t *pL)
{
	if(pL->length == 0)
	{
		printf("list is emtpy.\n");

		return 1;
	}

	return 0;
}

/*
 * @brief	线性表重置为空
 * @param	pL 线性表控制块指针
 * @reture  0
 */
int ListClear(List_t *pL)
{
	pL->length = 0;

	printf("list has been cleared.\n");

	return 0;
}

/*
 * @brief	线性表长度
 * @param	pL 线性表控制块指针
 * @reture  list length
 */
int ListLength(List_t *pL)
{
	return pL->length;
}

/*
 * @brief	线性表插入元素
 * @param	pL 线性表控制块指针
 * @param   pos 位置
 * @param   data 数据
 * @reture  success: 0		failed: -1
 */
int ListInsertData(List_t *pL, int pos, dataType data)
{
	int i;

	/* 判断线性表是否满 */
	if(pL->length == MAXSIZE)
	{
		printf("list is full.\n");

		return -1;
	}

	/* 当pos比第一个位置小或比最后一个位置大时 */
	if(pos < 1 || pos > (pL->length + 1))
	{
		printf("pos error.\n");

		return -1;
	}

	/* 如果插入位置不在表尾 */
	if(pos < pL->length)
	{
		/* 向后移动插入位置之后的数据 */
		for(i = pL->length - 1; i >= pos - 1; i--)
		{
			pL->data[i + 1] = pL->data[i];
		}
	}

	/* 插入新元素 */
	pL->data[pos - 1] = data;

	/* 更新线性表长度 */
	pL->length++;

	return 0;
}

/*
 * @brief	线性表查询元素
 * @param	pL 线性表控制块指针
 * @param   pos 位置
 * @param   pData 返回查询数据的指针
 * @reture  success: 0		failed: -1
 */
int ListSeekData(List_t *pL, int pos, dataType *pData)
{
	/* 判断线性表是否为空 */
	if(pL->length == 0)
	{
		return -1;
	}

	/* 当pos比第一个位置小或比最后一个位置大时 */
	if(pos < 1 || pos > pL->length)
	{
		return -1;
	}

	/* 返回查询的数据 */
	*pData = pL->data[pos - 1];

	return 0;
}
/*
 * @brief	线性表删除元素
 * @param	pL 线性表控制块指针
 * @param   pos 位置
 * @param   pData 返回删除数据的指针
 * @reture  success: 0		failed: -1
 */
int ListDeleteData(List_t *pL, int pos, dataType *pData)
{
	int i;

	/* 线性表为空 */
	if(pL->length == 0)
	{
		return -1;
	}

	/* 删除元素的位置不正确 */
	if(pos < 1 || pos > pL->length)
	{
		return -1;
	}

	*pData = pL->data[pos - 1];

	/* 删除的元素不在表尾 */
	if(pos < pL->length)
	{
		/* 向前移动删除元素的后继元素 */
		for(i = pos; i < pL->length; i++)
		{
			pL->data[i - 1] = pL->data[i];
		}
	}

	/* 更新线性表长度 */
	pL->length--;

	return 0;
}

/*
 * @brief	线性表遍历
 * @param	pL 线性表控制块指针
 * @reture  0
 */
int ListTraverse(List_t *pL)
{
	int i;

	printf("list data: ");
	for(i = 0; i < pL->length; i++)
	{
		printf("%d ", pL->data[i]);
	}

	printf("\n");

	return 0;
}
